Skip to main content

PHP中strtr函数 源码分析

PHP String 函数

定义和用法

strtr() 函数转换字符串中特定的字符。

语法

strtr(string,from,to)

或者

strtr(string,array)

参数描述

string1 必需。规定要转换的字符串。
from 必需(除非使用数组)。规定要改变的字符。
to 必需(除非使用数组)。规定要改变为的字符。
array 必需(除非使用 from 和 to)。一个数组,其中的键是原始字符,值是目标字符。

说明

如果 from 和 to 的长度不同,则格式化为最短的长度。 例子

例子 1

<?php
echo strtr("Hilla Warld","ia","eo");
?>

输出:

Hello World

例子 2

<?php

$arr = array("Hello" => "Hi", "world" => "earth");

echo strtr("Hello world",$arr);

?>

输出:

Hi earth

strtr函数实现的方法文件目录是 \php-5.4.40-src\ext\standard\string.c 第2774行

/* {{{ php_strtr
*/
PHPAPI char *php_strtr(char *str, int len, char *str_from, char *str_to, int trlen)
{
int i;
unsigned char xlat[256];

if ((trlen < 1) || (len < 1)) {
return str;
}

for (i = 0; i < 256; xlat[i] = i, i++);

for (i = 0; i < trlen; i++) {
xlat[(unsigned char) str_from[i]] = str_to[i];
}

for (i = 0; i < len; i++) {
str[i] = xlat[(unsigned char) str[i]];
}

return str;
}
/* }}} */

整个函数是对于256个字符进行hash替换,这256个字符中当然包括大小写字母啦 它是对每个字符进行对应替换,是以字符为单位,所以替换的是字符,而不是字符串。

echo strtr("I Love you","Lo","lO");

得到的结果是

I lOve yOu

这个结果提醒我们

  1. strtr它是区分大小写的
echo strtr("I Love you","Love","");

结果是

I Love you

什么也不会改变,所以strtr需要注意的是:不能被替换为空,也就是末位那个参数不能是空字符串,当然空格是可以的。

php_strtr(Z_STRVAL_P(return_value),
Z_STRLEN_P(return_value),
Z_STRVAL_PP(from),
to,
MIN(Z_STRLEN_PP(from),
to_len));

MIN(Z_STRLEN_PP(from), Z_STRLEN_PP(to))是取fromto两个字符串的长度中最小的,从php_strtr函数中我们可以看到

if ((trlen < 1) || (len < 1)) {
return str;
}

当长度小于1时返回原来的字符串。所以。。。。

echo strtr("I Loves you","Love","lOvEA");

结果是

I lOvEs yOu

注意看第三个参数的A,在结果中并没有出现。